package org.example.main;

import org.apache.spark.sql.SparkSession;
import scala.tools.nsc.MainClass;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/***
 * TODO 这里主要用来验证 spark 命令行体提交Spark应用程序中的 args.
 *  eg 命令行提交参数时这样的:
 *      spark-submit --class com.example.YourMainClass --master yarn --deploy-mode client --executor-memory 2g \
 *      --num-executors 4 --executor-cores 2 \
 *      --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
 *      /path/to/your/spark-application.jar arg1 arg2 arg3
 */
public class SparkMainClass {
    public static void main(String[] args) {
        // 首先会根据当前程序运行时是否传入参数来进行校验,如果不传 args参数,则直接程序退出.如果传入参数,则会去读取指定的配置文件,这里主要用来换不同的环境.例如:dev、test等.
        if (args.length < 1) {
            System.err.println("Usage: YourMainClass <env>");
            System.exit(1);
        }

        String env = args[0];
        String configFilePath;

        switch (env.toLowerCase()) {
            case "dev":
                configFilePath = "config-dev.properties";
                break;
            case "test":
                configFilePath = "config-test.properties";
                break;
            case "prod":
                configFilePath = "config-prod.properties";
                break;
            default:
                System.err.println("Invalid environment: " + env);
                System.exit(1);
                return;
        }

        Properties config = new Properties();
        try {
            // 这里通过类加载器通过 spark submit 提交参数时指定的配置文件读取指定的配置项.
            InputStream inputStream = MainClass.class.getClassLoader().getResourceAsStream(configFilePath);
            if (inputStream == null) {
                throw new IOException("Resource not found: " + configFilePath);
            }
            config.load(inputStream);
        } catch (IOException e) {
            System.err.println("Failed to load config file: " + configFilePath);
            e.printStackTrace();
            System.exit(1);
        }

        // 使用配置值创建 SparkSession
        SparkSession spark = SparkSession.builder()
                .appName(config.getProperty("spark.app.name"))
                .master(config.getProperty("spark.master"))
                .config("spark.executor.memory", config.getProperty("spark.executor.memory"))
                .getOrCreate();

        // 在这里继续您的 Spark 代码，例如加载输入数据，执行操作并将结果写入输出路径
        // 请使用已加载的配置值，如 config.getProperty("input.data.path") 和 config.getProperty("output.data.path")


        spark.stop();
    }
}
